﻿// 4550. 超级跳跳跳.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <cstring>


using namespace std;
/*
https://www.acwing.com/problem/content/4553/


超级跳跳跳是一种跳棋游戏。

该游戏的棋盘可以看作是 N+2个格子排成一排，最左端为“开始”格，最右端为“结束”格，中间的 N 个格子为“分数”格。

每个“分数”格中都包含一个正整数，表示该格子的分数。

初始时，你的棋子位于“开始”格，你需要让你的棋子跳到“结束”格。

在跳跃的过程中，需要注意：

从“开始”格可以跳到任意其他格（包括“结束”格）。
从任意其他格（包括“开始”格）均可以跳到“结束”格。
从一个分数为 A 的格子可以跳到另一个分数为 B 的格子，当且仅当 A<B。
只能向右跳，不能向左跳。
你的棋子在整个跳跃过程中，访问到的所有分数格子的分数相加之和应尽可能大。

请你计算并输出分数之和的最大可能值。

输入格式
输入包含多组测试数据。

每组数据占一行，首先包含一个整数 N，然后包含 N个整数 a1,a2,…,aN
，表示 N个格子的分数。

当输入 N=0时，表示输入结束。

输出格式
每组数据输出一行结果，一个整数，表示分数之和的最大可能值。

数据范围
输入最多包含 10 组数据。1≤N≤1000,
1≤ai≤10^5（这个范围是根据官网实际数据范围定的）。

输入样例：
3 1 3 2
4 1 2 3 4
4 3 3 2 1
0
输出样例：
4
10
3
*/

const int N = 1010;
int arr[N]; int dp[N];
int n ;

void solve() {
	memset(dp, 0, sizeof dp);
	for (int i = 1; i <= n; i++) { cin >> arr[i]; }
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < i; j++) {
			if (arr[i] > arr[j]) {
				dp[i] = max(dp[i], dp[j] + arr[i]);
			}
			ans = max(ans, dp[i]);
		}
	}
	cout << ans << endl;
}

int main()
{
	while (cin >> n) {
		if (0 == n) break;
		solve();
	}

	return 0;
}

 